package br.com.gr.jcash.dao;

import br.com.gr.jcash.dmp.Categoria;
import br.com.gr.jcash.dmp.Conta;
import br.com.gr.jcash.dmp.TipoCategoria;
import br.com.gr.jcash.dmp.Usuario;
import br.com.gr.jcash.exception.JCashException;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class ContaDAO extends AbstractDAO<Conta, Long> {

    @PersistenceContext(unitName = "jcash-PU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public ContaDAO() {
        super(Conta.class);
    }

    public Conta getContaPorDescricao(Usuario usuario, String descricao) throws JCashException {
        return buscarUnico("Conta.buscarPorDescricao", descricao, usuario);
    }

    @Override
    public Long count(Usuario usuario) throws JCashException {
        return count("Conta.count", usuario);
    }

    @Override
    public List<Conta> buscarTodos(Usuario usuario) throws JCashException {
        return buscarTodos("Conta.buscarTodos", usuario);
    }

    @Override
    public List<Conta> buscarPorFaixa(Usuario usuario, int[] faixa) throws JCashException {
        return buscarPorFaixa("Conta.buscarTodos", faixa, usuario);
    }

    public List<Conta> buscarPorTipoCategoria(Usuario usuario, TipoCategoria... tipos) throws JCashException {
        Collection<TipoCategoria> ct = Arrays.asList(tipos);
        return buscarTodos("Conta.buscarPorTipoCategoria", ct, usuario);
    }

    public Long countContaPorCategoria(Usuario usuario, Categoria categoria) throws JCashException {
        return count("Conta.countPorCategoria", categoria, usuario);
    }

    public BigDecimal buscarSomaEntradasEntreDatas(Usuario usuario, Conta conta, Date dataInicial, Date dataFinal) throws JCashException {
        BigDecimal soma = buscarSoma("Movimento.somaEntradasEntreDataPorConta", usuario, conta, dataInicial, dataFinal);
        if (null == soma) {
            return new BigDecimal("0");
        } else {
            return soma;
        }
    }

    public BigDecimal buscarSomaSaidasEntreDatas(Usuario usuario, Conta conta, Date dataInicial, Date dataFinal) throws JCashException {
        BigDecimal soma = buscarSoma("Movimento.somaSaidasEntreDataPorConta", usuario, conta, dataInicial, dataFinal);
        if (null == soma) {
            return new BigDecimal("0");
        } else {
            return soma;
        }
    }
}
